// 文件工具函数

/**
 * 获取文件扩展名
 * @param {string} filename 文件名
 * @returns {string} 扩展名
 */
export function getFileExtension(filename) {
  if (!filename) return ''
  const lastDot = filename.lastIndexOf('.')
  return lastDot === -1 ? '' : filename.substring(lastDot + 1).toLowerCase()
}

/**
 * 获取文件名（不含扩展名）
 * @param {string} filename 文件名
 * @returns {string} 文件名
 */
export function getFileName(filename) {
  if (!filename) return ''
  const lastDot = filename.lastIndexOf('.')
  return lastDot === -1 ? filename : filename.substring(0, lastDot)
}

/**
 * 检查文件类型
 * @param {File} file 文件对象
 * @param {string|Array} types 允许的类型
 * @returns {boolean} 是否符合类型
 */
export function checkFileType(file, types) {
  if (!file) return false

  const fileType = file.type
  const fileExtension = getFileExtension(file.name)

  if (Array.isArray(types)) {
    return types.some(type => {
      if (type.startsWith('.')) {
        return fileExtension === type.substring(1)
      }
      return fileType.includes(type)
    })
  }

  if (types.startsWith('.')) {
    return fileExtension === types.substring(1)
  }

  return fileType.includes(types)
}

/**
 * 检查文件大小
 * @param {File} file 文件对象
 * @param {number} maxSize 最大大小（字节）
 * @returns {boolean} 是否符合大小限制
 */
export function checkFileSize(file, maxSize) {
  if (!file) return false
  return file.size <= maxSize
}

/**
 * 验证文件
 * @param {File} file 文件对象
 * @param {object} options 验证选项
 * @returns {object} 验证结果
 */
export function validateFile(file, options = {}) {
  const result = {
    isValid: true,
    errors: []
  }

  if (!file) {
    result.isValid = false
    result.errors.push('请选择文件')
    return result
  }

  // 检查文件类型
  if (options.allowedTypes && !checkFileType(file, options.allowedTypes)) {
    result.isValid = false
    result.errors.push(`文件类型不支持，支持的类型：${Array.isArray(options.allowedTypes) ? options.allowedTypes.join(', ') : options.allowedTypes}`)
  }

  // 检查文件大小
  if (options.maxSize && !checkFileSize(file, options.maxSize)) {
    result.isValid = false
    result.errors.push(`文件大小不能超过${formatFileSize(options.maxSize)}`)
  }

  return result
}

/**
 * 读取文件为Base64
 * @param {File} file 文件对象
 * @returns {Promise<string>} Base64字符串
 */
export function readFileAsBase64(file) {
  return new Promise((resolve, reject) => {
    if (!file) {
      reject(new Error('文件不存在'))
      return
    }

    const reader = new FileReader()

    reader.onload = () => {
      resolve(reader.result)
    }

    reader.onerror = () => {
      reject(new Error('文件读取失败'))
    }

    reader.readAsDataURL(file)
  })
}

/**
 * 读取文件为文本
 * @param {File} file 文件对象
 * @param {string} encoding 编码格式
 * @returns {Promise<string>} 文本内容
 */
export function readFileAsText(file, encoding = 'UTF-8') {
  return new Promise((resolve, reject) => {
    if (!file) {
      reject(new Error('文件不存在'))
      return
    }

    const reader = new FileReader()

    reader.onload = () => {
      resolve(reader.result)
    }

    reader.onerror = () => {
      reject(new Error('文件读取失败'))
    }

    reader.readAsText(file, encoding)
  })
}

/**
 * 下载文件
 * @param {string} url 文件URL
 * @param {string} filename 文件名
 */
export function downloadFile(url, filename) {
  const link = document.createElement('a')
  link.href = url
  link.download = filename || 'download'
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)
}

/**
 * 下载Blob文件
 * @param {Blob} blob Blob对象
 * @param {string} filename 文件名
 */
export function downloadBlob(blob, filename) {
  const url = URL.createObjectURL(blob)
  downloadFile(url, filename)
  URL.revokeObjectURL(url)
}

/**
 * 压缩图片
 * @param {File} file 图片文件
 * @param {number} quality 压缩质量 (0-1)
 * @param {number} maxWidth 最大宽度
 * @param {number} maxHeight 最大高度
 * @returns {Promise<Blob>} 压缩后的图片Blob
 */
export function compressImage(file, quality = 0.8, maxWidth = 1920, maxHeight = 1080) {
  return new Promise((resolve, reject) => {
    if (!file || !file.type.startsWith('image/')) {
      reject(new Error('请选择图片文件'))
      return
    }

    const canvas = document.createElement('canvas')
    const ctx = canvas.getContext('2d')
    const img = new Image()

    img.onload = () => {
      // 计算压缩后的尺寸
      let { width, height } = img

      if (width > maxWidth || height > maxHeight) {
        const ratio = Math.min(maxWidth / width, maxHeight / height)
        width *= ratio
        height *= ratio
      }

      canvas.width = width
      canvas.height = height

      // 绘制压缩后的图片
      ctx.drawImage(img, 0, 0, width, height)

      // 转换为Blob
      canvas.toBlob(
        (blob) => {
          if (blob) {
            resolve(blob)
          } else {
            reject(new Error('图片压缩失败'))
          }
        },
        file.type,
        quality
      )
    }

    img.onerror = () => {
      reject(new Error('图片加载失败'))
    }

    img.src = URL.createObjectURL(file)
  })
}

/**
 * 获取图片尺寸
 * @param {File|string} file 图片文件或URL
 * @returns {Promise<object>} 图片尺寸
 */
export function getImageDimensions(file) {
  return new Promise((resolve, reject) => {
    const img = new Image()

    img.onload = () => {
      resolve({
        width: img.naturalWidth,
        height: img.naturalHeight
      })
    }

    img.onerror = () => {
      reject(new Error('图片加载失败'))
    }

    if (typeof file === 'string') {
      img.src = file
    } else {
      img.src = URL.createObjectURL(file)
    }
  })
}

/**
 * 生成唯一文件名
 * @param {string} originalName 原始文件名
 * @returns {string} 唯一文件名
 */
export function generateUniqueFileName(originalName) {
  const timestamp = Date.now()
  const random = Math.random().toString(36).substring(2, 8)
  const extension = getFileExtension(originalName)
  const name = getFileName(originalName)

  return `${name}_${timestamp}_${random}${extension ? '.' + extension : ''}`
}

// 导入格式化函数
import { formatFileSize } from './format'
